package com.firewolf.shiro;

import org.apache.shiro.crypto.SecureRandomNumberGenerator;
import org.apache.shiro.crypto.hash.DefaultHashService;
import org.apache.shiro.crypto.hash.HashRequest;
import org.apache.shiro.crypto.hash.Md5Hash;
import org.apache.shiro.crypto.hash.Sha1Hash;
import org.apache.shiro.crypto.hash.Sha256Hash;
import org.apache.shiro.crypto.hash.Sha384Hash;
import org.apache.shiro.crypto.hash.Sha512Hash;
import org.apache.shiro.crypto.hash.SimpleHash;
import org.apache.shiro.util.ByteSource;
import org.apache.shiro.util.SimpleByteSource;
import org.junit.Test;

/**
 * 散列算法，不可逆，生成摘要信息
 * 
 * @author lx
 *
 */
public class Hash {

	/**
	 * md5哈希
	 */
	@Test
	public void md5hash() {
		String str = "hello";// 要被散列的字符串
		String salt = "123";// 盐
		String md5 = new Md5Hash(str, salt).toString();// 还可以转换为
														// toBase64()/toHex()
		System.out.println(md5);

		// 指定散列次数为3次
		String md52 = new Md5Hash(str, salt, 3).toString();
		System.out.println(md52);
	}

	/**
	 * 使用SHA256算法生成相应的散列数据
	 */
	@Test
	public void sha256() {
		String str = "hello";// 要被散列的字符串
		String salt = "123";// 盐
		String sah = new Sha256Hash(str, salt, 5).toString();
		System.out.println(sah);
	}

	/**
	 * Sha1
	 */
	@Test
	public void testSha1() {
		String str = "hello";
		String salt = "123";
		String sha1 = new Sha1Hash(str, salt).toString();
		System.out.println(sha1);

	}
	
	/**
	 * Sha384
	 */
	@Test
    public void testSha384() {
        String str = "hello";
        String salt = "123";
        String sha1 = new Sha384Hash(str, salt).toString();
        System.out.println(sha1);

    }

	/**
	 * Sha512
	 */
	@Test
    public void testSha512() {
        String str = "hello";
        String salt = "123";
        String sha1 = new Sha512Hash(str, salt).toString();
        System.out.println(sha1);
    }
	
	/**
	 * 通用的散列
	 */
	@Test
	public void shacommon() {
		String str = "hello";// 要被散列的字符串
		String salt = "123";// 盐
		// 可以使用SHA512，SHA256等
		String simpleHash = new SimpleHash("SHA-1", str, salt, 5).toString();
		System.out.println(simpleHash);
	}

	@Test
	public void shiroHash() {
		// 1.创建DefaultHashService
		DefaultHashService hashService = new DefaultHashService(); // 默认算法SHA-512
		// 2.设置算法
		hashService.setHashAlgorithmName("MD5");
		// 3.设置私盐
		hashService.setPrivateSalt(new SimpleByteSource("123")); // 私盐，默认无
		// 4.设置没有公盐的情况下是否生成公盐
		hashService.setGeneratePublicSalt(false);// 是否生成公盐，默认false
		// 5.设置randomNumberGenerator用于生成公盐
		hashService.setRandomNumberGenerator(new SecureRandomNumberGenerator());// 用于生成公盐。默认就这个
		// 6.设置hash次数
		hashService.setHashIterations(2); // 生成Hash值的迭代次数

		// 7.需要构建一个HashRequest，传入算法、数据、公盐、迭代次数
		HashRequest request = new HashRequest.Builder().setAlgorithmName("MD5")
				.setSource(ByteSource.Util.bytes("hello")).setSalt(ByteSource.Util.bytes("123")).setIterations(2)
				.build();

		String hex = hashService.computeHash(request).toHex();
		System.out.println(hex);

	}
}
